import ComposableArchitecture
import GameCore
import XCTest

@testable import GameSwiftUI

class GameSwiftUITests: XCTestCase {
  let store = TestStore(
    initialState: GameState(
      oPlayerName: "Blob Jr.",
      xPlayerName: "Blob Sr."
    ),
    reducer: gameReducer,
    environment: GameEnvironment()
  )
  .scope(state: { $0.view })

  func testFlow_Winner_Quit() {
    self.store.assert(
      .send(.cellTapped(row: 0, column: 0)) {
        $0.board[0][0] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 2, column: 1)) {
        $0.board[2][1] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 1, column: 0)) {
        $0.board[1][0] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 1, column: 1)) {
        $0.board[1][1] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 2, column: 0)) {
        $0.board[2][0] = "❌"
        $0.isGameDisabled = true
        $0.isPlayAgainButtonVisible = true
        $0.title = "Winner! Congrats Blob Sr.!"
      },
      .send(.quitButtonTapped)
    )
  }

  func testFlow_Tie() {
    self.store.assert(
      .send(.cellTapped(row: 0, column: 0)) {
        $0.board[0][0] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 2, column: 2)) {
        $0.board[2][2] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 1, column: 0)) {
        $0.board[1][0] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 2, column: 0)) {
        $0.board[2][0] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 2, column: 1)) {
        $0.board[2][1] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 1, column: 2)) {
        $0.board[1][2] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 0, column: 2)) {
        $0.board[0][2] = "❌"
        $0.title = "Blob Jr., place your ⭕️"
      },
      .send(.cellTapped(row: 0, column: 1)) {
        $0.board[0][1] = "⭕️"
        $0.title = "Blob Sr., place your ❌"
      },
      .send(.cellTapped(row: 1, column: 1)) {
        $0.board[1][1] = "❌"
        $0.isGameDisabled = true
        $0.isPlayAgainButtonVisible = true
        $0.title = "Tied game!"
      },
      .send(.playAgainButtonTapped) {
        $0 = GameState(oPlayerName: "Blob Jr.", xPlayerName: "Blob Sr.").view
      }
    )
  }
}
